package com.jevons.muffin.util;

import android.annotation.SuppressLint;
import android.text.TextUtils;

import com.jevons.muffin.utilcode.LogUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/**
 * 日期处理工具类
 * @author linaisheng
 * Create at 2019/3/19
 */
@SuppressLint("SimpleDateFormat")
public final class DateUtils {

    private static final String TAG = DateUtils.class.getSimpleName();

    /**
     * String 日期格式：yyyy-MM
     */
    public static final String DATE_FORMAT_YEAR_MONTH = "yyyy-MM";
    /**
     * String 日期格式：yyyyMMdd
     */
    public static final String DATE_FORMAT_yyyyMMdd = "yyyyMMdd";
    /**
     * String 日期格式：yyyy年M月d日
     */
    public static final String DATE_FORMAT_yyyy年M月d日 = "yyyy年M月d日";

    /**
     * String 日期格式：yyyy-MM-dd HH:mm
     */
    public static final String DATE_TIME_yyyy_MM_dd = "yyyy-MM-dd";
    /**
     * String 日期格式：yyyy-MM-dd HH:mm
     */
    public static final String DATE_TIME_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
    /**
     * String 日期格式：yyyy-M-d H:mm
     */
    public static final String DATE_TIME_yyyy_M_d_H_mm = "yyyy-M-d H:mm";
    /**
     * String 日期格式：yyyy-M-d H:mm:ss
     */
    public static final String DATE_TIME_yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";

    /**
     * String 日期格式：M-d H:mm:ss
     */
    public static final String DATE_TIME_MM_dd_HH_mm_ss = "MM-dd HH:mm:ss";

    /**
     * String 日期格式：M-d
     */
    public static final String DATE_TIME_MM_dd = "MM-dd";

    /**
     * String 日期格式：H:mm:ss
     */
    public static final String DATE_TIME_HH_mm_ss = "H:mm:ss";

    /**
     * String 日期格式：mm:ss
     */
    public static final String DATE_TIME_mm_ss = "mm:ss";



    /**
     * SimpleDateFormat 日期格式：yyyy-MM-dd
     */
    public static final SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * SimpleDateFormat 日期格式：yyyy-MM-dd HH:mm:ss
     */
    public static final SimpleDateFormat FORMAT_DATE_MINUTE = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    /**
     * SimpleDateFormat 日期格式：yyyy-MM-dd HH:mm:ss
     */
    public static final SimpleDateFormat FORMAT_DATE_TIME = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    /**
     * SimpleDateFormat 日期格式：yyyyMMdd
     */
    public static final SimpleDateFormat FORMAT_DATE_yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
    /**
     * SimpleDateFormat 日期格式：yyyyMMddHHmmss
     */
    public static final SimpleDateFormat FORMAT_YYYYMMDDHHMMSS = new SimpleDateFormat("yyyyMMddHHmmss");


    /**
     * 获取当前时间---格式yyyy-MM-dd
     *
     * @return 按yyyy-MM-dd格式转化后的当前时间
     */
    public static String getCurrentDate() {
        return FORMAT_DATE.format(new Date());
    }

    /**
     * 按指定格式获取当前时间
     *
     * @param stringFormat String类型的日期格式
     * @return 按指定格式转化后的当前时间
     */
    public static String getCurrentDate(String stringFormat) {
        return new SimpleDateFormat(stringFormat).format(new Date());
    }

    /**
     * 按指定格式获取当前时间
     *
     * @param simpleDateFormat SimpleDateFormat类型的日期格式
     * @return 按指定格式转化后的当前时间
     */
    public static String getCurrentDate(SimpleDateFormat simpleDateFormat) {
        return simpleDateFormat.format(new Date());
    }

    /**
     * 获取当前时间--格式yyyy-MM-dd HH:mm:ss
     *
     * @return 按yyyy-MM-dd HH:mm:ss格式转化后的当前时间
     */
    public static String getCurrentTime() {
        return FORMAT_DATE_TIME.format(new Date());
    }

    /**
     * 截取日期中的---年月日（不包含时间）
     *
     * @param date 时间字符串
     * @return String
     */
    public static String getDate(String date) {
        if ((date == null) || (date.length() < 10)) {
            return date;
        }
        return date.substring(0, 10);
    }

    /**
     * 截取日期中的---“年”
     *
     * @param date 日期
     * @return String 日期中的年
     */
    public static String getYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        return Integer.toString(calendar.get(Calendar.YEAR));
    }

    /**
     * 截取日期中的---“月”（不足两位的将在前面补0） 如2016.4.5--最终得到04
     *
     * @param date 日期
     * @return String 日期中的月
     */
    public static String getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        return zeroPad(calendar.get(Calendar.MONTH) + 1, 2);
    }

    /**
     * 截取日期中的---“日”（不足两位的将在前面补0） 如2016.4.5--最终得到05
     *
     * @param date 日期
     * @return String 日期中月份的日期
     */
    public static String getDayOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        return zeroPad(calendar.get(Calendar.DAY_OF_MONTH), 2);
    }

    /**
     * 功能描述：返回小时(返回两位数，不足补零)
     *
     * @param date 日期
     * @return String 返回小时
     */
    public static String getHour(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        return zeroPad(calendar.get(Calendar.HOUR_OF_DAY), 2);
    }

    /**
     * 功能描述：返回分钟--(返回两位数，不足补零)
     *
     * @param date 日期
     * @return String 返回分钟
     */
    public static String getMinute(Date date) {
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        return zeroPad(calendar.get(Calendar.MINUTE), 2);
    }

    /**
     * 功能描述：返回毫秒
     *
     * @param date 日期
     * @return 返回毫秒
     */
    public static long getMillis(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getTimeInMillis();
    }

    /**
     * 获取时间中的--“时分秒”
     *
     * @param date--String 时间格式"yyyy-MM-dd HH:mm:ss"
     * @return String 返回时间 如 11:11:11
     */
    public static String getTime(String date) {
        if (TextUtils.isEmpty(date)) {
            return "";
        }

        return getTime(formatStringByFormat(date, FORMAT_DATE_TIME));
    }

    /**
     * 获取时间中的--“时分秒”
     *
     * @param date--Date
     * @return String 返回时间 如 11:11:11
     */
    public static String getTime(Date date) {
        if (null == date) {
            return "";
        }
        Calendar calendar = Calendar.getInstance(Locale.CHINA);
        calendar.setTime(date);

        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);

        return hour + ":" + minute + ":" + second;
    }

    /**
     * 获取某天是星期几
     *
     * @param date Date 日期
     * @return String 周几
     */
    public static String getMonthDayWeek(Date date) {
        if (null == date) {
            return "";
        }

        Calendar c = Calendar.getInstance();
        c.setTime(date);

        int week = c.get(Calendar.DAY_OF_WEEK);
        String weekStr = null;

        switch (week) {
            case Calendar.SUNDAY:
                weekStr = "周日";
                break;
            case Calendar.MONDAY:
                weekStr = "周一";
                break;
            case Calendar.TUESDAY:
                weekStr = "周二";
                break;
            case Calendar.WEDNESDAY:
                weekStr = "周三";
                break;
            case Calendar.THURSDAY:
                weekStr = "周四";
                break;
            case Calendar.FRIDAY:
                weekStr = "周五";
                break;
            case Calendar.SATURDAY:
                weekStr = "周六";
                break;
        }
        return weekStr;
    }

    /**
     * 获得口头时间字符串，如今天，昨天等
     *
     * @param time long 时间
     * @return 口头时间字符串
     */
    public static String getTimeInterval(long time) {
        return getTimeInterval(new Date(time));
    }

    /**
     * 获得口头时间字符串，如今天，昨天等
     *
     * @param date   String 时间
     * @param format 时间格式
     * @return 口头时间字符串
     */
    public static String getTimeInterval(String date, String format) {
        return getTimeInterval(formatStringByFormat(date, format));
    }

    /**
     * 获得口头时间字符串，如今天，昨天等
     *
     * @param date Date 时间
     * @return 口头时间字符串
     */
    public static String getTimeInterval(Date date) {
        Calendar ca = Calendar.getInstance();
        if (date != null) {
            ca.setTime(date);
        } else {
            ca.setTime(new Date());
        }
        int year = ca.get(Calendar.YEAR);
        int month = ca.get(Calendar.MONTH);
        int week = ca.get(Calendar.WEEK_OF_MONTH);
        int day = ca.get(Calendar.DAY_OF_WEEK);
        int hour = ca.get(Calendar.HOUR_OF_DAY);
        int minute = ca.get(Calendar.MINUTE);

        Calendar now = Calendar.getInstance();
        now.setTime(new Date());
        int nowYear = now.get(Calendar.YEAR);
        int nowMonth = now.get(Calendar.MONTH);
        int nowWeek = now.get(Calendar.WEEK_OF_MONTH);
        int nowDay = now.get(Calendar.DAY_OF_WEEK);
        int nowHour = now.get(Calendar.HOUR_OF_DAY);
        int nowMinute = now.get(Calendar.MINUTE);

        if (year != nowYear) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //不同年份
            return sdf.format(date);
        } else {
            if (month != nowMonth) {
                //不同月份
                SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
                return sdf.format(date);
            } else {
                if (week != nowWeek) {
                    //不同周
                    SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
                    return sdf.format(date);
                } else if (day != nowDay) {
                    if (day + 1 == nowDay) {
                        return "昨天" + formatDateByFormat(date, "HH:mm");
                    }
                    if (day + 2 == nowDay) {
                        return "前天" + formatDateByFormat(date, "HH:mm");
                    }
                    //不同天
                    SimpleDateFormat sdf = new SimpleDateFormat("M月dd日");
                    return sdf.format(date);
                } else {
                    //同一天
                    int hourGap = nowHour - hour;
                    //1小时内
                    if (hourGap == 0) {
                        if (nowMinute - minute < 1) {
                            return "刚刚";
                        } else {
                            return (nowMinute - minute) + "分钟前";
                        }
                    } else if (hourGap >= 1 && hourGap <= 12) {

                        int difftime = (int) ((now.getTimeInMillis() - ca.getTimeInMillis()) / 1000);

                        if (difftime < 3600) {
                            return (difftime / 60) + "分钟前";
                        } else {
                            return (difftime / 3600) + "小时前";
                        }
                    } else {
                        SimpleDateFormat sdf = new SimpleDateFormat("今天 HH:mm");
                        return sdf.format(date);
                    }
                }
            }
        }
    }

    /**
     * 将指定时间的月份提前或减少 value个月
     *
     * @param date   日期
     * @param value  增加或减少的个数
     * @param format 输出的日期格式
     * @return String
     */
    public static String getTimePassedMonth(Date date, int value, SimpleDateFormat format) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, value);
        if (format == null) {
            format = FORMAT_DATE;
        }

        return format.format(calendar.getTime());
    }

    /**
     * 将String类型的日期转化为date型的
     *
     * @param date   日期字符串
     * @param format SimpleDateFormat 传入的日期格式
     * @return Date
     */
    public static Date formatStringByFormat(String date, SimpleDateFormat format) {
        try {
            return format.parse(date);
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return new Date();
    }

    /**
     * 将String类型的日期转化为date型的
     *
     * @param date   日期字符串
     * @param format String 传入的日期格式
     * @return Date
     */
    public static Date formatStringByFormat(String date, String format) {
        try {
            return new SimpleDateFormat(format).parse(date);
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return new Date();
    }

    /**
     * 按格式转换时间
     *
     * @param date   需要转换的Date
     * @param format 目标转换格式
     * @return String
     */
    public static String formatDateByFormat(Date date, String format) {
        if (date == null) {
            return "";
        }
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 转换日期格式
     *
     * @param date    目标时间
     * @param format1 目标时间的格式
     * @param format2 需要转换成的格式
     * @return String
     */
    public static String convertDateString(String date, SimpleDateFormat format1, SimpleDateFormat format2) {
        try {
            return format2.format(format1.parse(date));
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return "";
    }

    /**
     * 比较两个日期的大小（两个日期格式必须为yyyy-MM-dd HH:mm:ss）
     *
     * @param date1 日期1
     * @param date2 日期2
     * @return true 说明日期1在日期2之前
     */
    public static boolean isBefore(String date1, String date2) {
        try {
            boolean isBefore = FORMAT_DATE_TIME.parse(date1).before(FORMAT_DATE_TIME.parse(date2));
            return isBefore;
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return false;
    }

    /**
     * 根据--指定时间格式--比较时间大小
     *
     * @param date1   日期1
     * @param date2   日期2
     * @param mFormat 传入的日期格式
     * @return true 说明日期1在日期2之前
     */
    public static boolean isBefore(String date1, String date2, String mFormat) {
        SimpleDateFormat format = new SimpleDateFormat(mFormat);
        try {
            boolean isBefore = format.parse(date1).before(format.parse(date2));
            return isBefore;
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return false;
    }

    /**
     * 根据--指定时间格式--比较时间大小
     *
     * @param date1   日期1
     * @param date2   日期2
     * @param mFormat 传入的日期格式
     * @return true 说明日期1在日期2之前
     */
    public static boolean isDateAfter(String date1, String date2, String mFormat) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(mFormat);
            Date date = format.parse(date1);
            boolean isAfter = format.parse(date2).after(date);
            return isAfter;
        } catch (ParseException exception) {
            LogUtils.printWarnTag(TAG, exception.toString());
        }
        return false;
    }

    /**
     * 将int类型转换为字符串，位数不足的在前面补零
     *
     * @param temp   需要处理的变量
     * @param length "补零"的个数
     * @return String
     */
    public static String zeroPad(int temp, int length) {
        return String.format(Locale.getDefault(), "%0" + length + "d", temp);
    }


    /**
     * 支持jdk1.7的写法
     * 解析2015-12-27T14:20:34+08:00格式类型的时间
     * 将2015-12-27T14:20:34+08:00转换成2015-12-27 14:20:34
     * @param str
     * @return
     */
    public static Date getTimestampTimeV17(String str) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            TimeZone tz = TimeZone.getTimeZone("UTC");
            sdf.setTimeZone(tz);
            Date date = sdf.parse(str);
            return date;
        } catch (Exception e) {}
        return null;
    }

}
